// 简单的 Git 仓库脚手架核心
const ora = require('ora').default;      // 进度条库
const chalk = require('chalk').default;  // 控制台彩色输出

/**
 * 创建新项目
 * @param {string} name - 项目名称
 */
async function create(name) {
  // 动态导入 inquirer，用于命令行交互
  const inquirer = await import('inquirer');
  const fs = require('fs-extra');        // 文件操作库
  const path = require('path');          // 路径处理库
  const { execSync } = require('child_process'); // 执行 shell 命令

  // 目标目录
  const targetDir = path.resolve(process.cwd(), name);

  // 检查目录是否已存在
  if (fs.existsSync(targetDir)) {
    console.log(chalk.red('目录已存在！'));
    return;
  }

  // 询问用户输入 Git 仓库地址（可自定义，默认你的模板仓库）
  const { gitUrl } = await inquirer.default.prompt([
    { name: 'gitUrl', message: 'Git 仓库地址：', default: 'https://gitee.com/high-school-5-projects/vue31.git' }
  ]);

  // 询问用户输入项目描述
  const { desc } = await inquirer.default.prompt([
    { name: 'desc', message: '项目描述：', default: '' }
  ]);

  // 开始下载模板
  const spinner = ora('下载模板中...').start();

  try {
    // 创建临时目录
    const tempDir = path.resolve(__dirname, '../temp');
    if (fs.existsSync(tempDir)) await fs.remove(tempDir);
    await fs.ensureDir(tempDir);

    // 克隆 Git 仓库到临时目录
    execSync(`git clone ${gitUrl} ${tempDir}`, { stdio: 'pipe' });
    spinner.succeed('下载成功！');

    // 复制模板到目标目录（排除 .git 目录）
    const createSpinner = ora('创建项目中...').start();
    await fs.copy(tempDir, targetDir, {
      filter: (src) => !src.includes(`${path.sep}.git${path.sep}`)
    });

    // 替换模板变量
    const files = await fs.readdir(targetDir, { recursive: true });
    for (const file of files) {
      const filePath = path.join(targetDir, file);
      const stat = await fs.stat(filePath);
      if (stat.isFile()) {
        let content = await fs.readFile(filePath, 'utf8');
        // 替换 {{name}} 和 {{desc}}
        content = content.replace(/\{\{name\}\}/g, name);
        content = content.replace(/\{\{desc\}\}/g, desc);
        await fs.writeFile(filePath, content, 'utf8');
      }
    }

    // 删除临时目录
    await fs.remove(tempDir);
    createSpinner.succeed('项目创建成功！');
    // 提示用户后续操作
    console.log(chalk.green(`cd ${name} && npm install`));
  } catch (error) {
    spinner.fail('失败！');
    console.log(chalk.red(error.message));
  }
}

// 导出 create 函数
module.exports = create;